Skip to main content

Revisión de Servicios y Metodología de Trabajo - PPL

Universidad de Sevilla

Universidad de Sevilla

Escuela Técnica Superior de Ingeniería Informática

Grado en Ingeniería Informática – Ingeniería del Software

Curso: 2024 – 2025
Fecha: 16/04/2025
Versión: v1.0

Grupo de prácticas: G1
Nombre del grupo de prácticas: ISPP - Grupo 1 - Holos

  • María del Mar Ávila Maqueda
  • Joaquín González Ganfornina
  • Nerea Jiménez Adorna
  • Juan del Junco Obregón
  • Miguel Ángel Gómez Vela
  • Juan Antonio Moreno Moguel
  • María del Carmen Barrera Garrancho
  • Daniel Guedes Preciados
  • Julia Virginia Ángeles Burgos
  • Javier Muñoz Romero
  • Juan Núñez Sánchez
  • Nicolás Pérez Gómez
  • Francisco Pérez Lázaro
  • Celia Aguilera Camino
  • Gabriel María Vacaro Goytía
  • Ignacio Warleta Murcia
  • José María Portela Huerta

Responsables:

MiembroResponsabilidad
Miguel Gómez VelaRedactor
José María Portela HuertaRevisor y Corrector

Repositorio: GitHub - Holos-INC

Tabla de versiones

VersiónFechaDescripción de cambiosAutor
v1.016/04/2025Creación y redaccion del documento.Miguel Gómez Vela

Índice


Introducción

En este apartado se documentarán todos los servicios actuales organizados por clases. Para cada servicio se debe incluir:

  • Nombre del Servicio / Clase y su Ruta
    Indicar el nombre de la clase y la ruta asociada a los métodos implementados en dicha clase.

  • Descripción:
    Breve descripción del servicio y su función general dentro de la aplicación.

  • Métodos Implementados:
    Listado de los métodos implementados en la clase con detalles sobre el tipo de operación que realizan (GET, POST, PUT, DELETE), además de indicar si se exponen a la API o son solo funciones internas.

  • Categoría de la llamada:
    Clasificación del servicio según su implementación actual:

    • Bien hecha: El servicio está completamente implementado y funcionando como se esperaba.
    • A eliminar: El servicio no es útil o está obsoleto.
    • A corregir: El servicio tiene errores, necesita mejoras o no está alineado con los estándares de la arquitectura actual.
    • No usado: El servicio no se usa actualmente, pero se espera que sea utilizado en el futuro.
  • Datos que reciben:
    Descripción de los datos que el servicio espera recibir. Si hay algún parámetro innecesario o datos no requeridos (como el "ID" de usuario si se puede obtener mediante autenticación), debe ser indicado. Esto incluiría detalles sobre los DTOs que se pasan al servicio.

  • Datos que devuelven:
    Especificar qué tipo de datos el servicio devuelve, como JSON, objetos o listas de objetos. También se deben proporcionar ejemplos de las respuestas y detalles sobre los DTOs involucrados.

  • Errores y Excepciones:
    Explicar cómo se manejan los errores en el servicio, como las excepciones que se lanzan cuando los datos de entrada son incorrectos o faltan.

  • Dependencias:
    Mencionar si el servicio depende de otras clases o servicios y cómo interactúan entre sí (por ejemplo, repositorios, otros servicios).

Este documento se actualizará conforme a las necesidades y cambios del equipo.


Análisis de servicios

WorksDoneService


Intencionadamente en blanco.


MilestoneService

Todo en esta categoría está aún sin usar, por lo que no se saben las necesidades de front aún.


StatusKanbanOrderService


Intencionadamente en blanco.


CommisionService

Antes de entrar en esta parte, comentar cómo se gestionarán los distintos estados en los que se encontrará una comisión, con un diagrama de estados:

Estados de una comisión

Descripción General del Servicio:

El CommisionService gestiona las operaciones relacionadas con las comisiones, incluyendo la creación, modificación, cancelación, aceptación y rechazo de comisiones, así como la gestión de su estado a lo largo del proceso. También gestiona el historial de comisiones de clientes y artistas, y la lógica asociada al cambio de estado de las comisiones, como su aceptación, rechazo o cancelación.

Métodos Implementados:

Método 1: getAllCommisions

Descripción:

Este método recupera todas las comisiones almacenadas en el sistema.

Tipo: GET

Ruta: /api/v1/commisions

Categoría de la llamada:

  • Bien hecha: El servicio está completamente implementado y funciona como se espera.

Datos que reciben:

  • No requiere parámetros.

Datos que devuelven:

  • Respuesta JSON: Lista de todas las comisiones. Ejemplo:
    [
    {
    "id": 1,
    "name": "Comisión de retrato",
    "description": "Descripción del retrato encargado",
    "price": 100.0,
    "status": "REQUESTED"
    }
    ]

Método 2: createCommision

Descripción:

Este método crea una nueva comisión para un artista específico.

Tipo: POST

Ruta: /api/v1/commisions/{artistId}

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • Path Variable:
    • artistId (Long): Identificador del artista al que se asignará la comisión.
  • Request Body:
    • commisionDTO (Objeto CommisionRequestDTO): Información necesaria para crear la comisión.

Datos que devuelven:

  • Respuesta JSON: Objeto CommissionDTO con los datos de la comisión creada. Ejemplo:
    {
    "id": 1,
    "name": "Retrato de familia",
    "description": "Retrato en óleo de la familia",
    "price": 150.0,
    "status": "REQUESTED",
    "artistUsername": "artist1"
    }

Método 3: requestChangesCommision

Descripción:

Solicita cambios en una comisión existente.

Tipo: PUT

Ruta: /api/v1/commisions/{commisionId}/requestChanges

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • Path Variable:
    • commisionId (Long): Identificador de la comisión a modificar.
  • Request Body:
    • commisionDTO (Objeto CommissionDTO): Datos actualizados de la comisión.

Datos que devuelven:

  • Respuesta JSON: Objeto Commision actualizado con los cambios solicitados.

Método 4: getCommisionById

Descripción:

Recupera una comisión específica identificada por su "ID".

Tipo: GET

Ruta: /api/v1/commisions/{commisionId}

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • Path Variable:
    • commisionId (Long): Identificador de la comisión a recuperar.

Datos que devuelven:

  • Respuesta JSON: Objeto CommisionDTO con la información de la comisión. Ejemplo:
    {
    "id": 1,
    "name": "Retrato a lápiz",
    "description": "Retrato detallado en lápiz de un paisaje",
    "price": 80.0,
    "status": "REQUESTED",
    "artistUsername": "artist2",
    "clientUsername": "client1"
    }

Método 5: updateCommisionStatus

Descripción:

Actualiza el estado de una comisión, dependiendo de si ha sido aceptada o rechazada.

Tipo: PUT

Ruta: /api/v1/commisions/{commisionId}/accept

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • Path Variable:
    • commisionId (Long): Identificador de la comisión a actualizar.
  • Request Parameter:
    • accept (boolean): Indicador de si la comisión ha sido aceptada (true) o rechazada (false).

Datos que devuelven:

  • Respuesta JSON: Objeto Commision actualizado con el nuevo estado. Ejemplo:
    {
    "id": 1,
    "status": "ACCEPTED"
    }

Método 6: waitingCommission

Descripción:

Pone una comisión en espera para confirmación del precio.

Tipo: PUT

Ruta: /api/v1/commisions/{commisionId}/waiting

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • Path Variable:
    • commisionId (Long): Identificador de la comisión a poner en espera.
  • Request Body:
    • priceChanged (Objeto CommissionDTO): Datos de la comisión con el precio actualizado.

Datos que devuelven:

  • Respuesta JSON: Mensaje indicando que la comisión está en espera de confirmación del precio. Ejemplo:
    "Waiting for price confirmation."

Método 7: toPayCommission

Descripción:

Actualiza el estado de la comisión a "para pagar" después de la confirmación del precio.

Tipo: PUT

Ruta: /api/v1/commisions/{commisionId}/toPay

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • Path Variable:
    • commisionId (Long): Identificador de la comisión a actualizar.

Datos que devuelven:

  • Respuesta JSON: Mensaje indicando que la comisión fue aceptada correctamente. Ejemplo:
    "Price confirmed successfully."

Método 8: rejectCommission

Descripción:

Rechaza una comisión, actualizando su estado.

Tipo: PUT

Ruta: /api/v1/commisions/{commisionId}/reject

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • Path Variable:
    • commisionId (Long): Identificador de la comisión a rechazar.

Datos que devuelven:

  • Respuesta JSON: Mensaje indicando que la comisión fue rechazada correctamente. Ejemplo:
    "Commission rejected successfully."

check

Método 9: acceptCommission

Descripción:

Acepta una comisión, actualizando su estado.

Tipo: PUT

Ruta: /api/v1/commisions/{commisionId}/accept

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • Path Variable:
    • commisionId (Long): Identificador de la comisión a aceptar.

Datos que devuelven:

  • Respuesta JSON: Mensaje indicando que la comisión fue aceptada correctamente. Ejemplo:
    "Commission accepted successfully."

Método 10: cancelCommission

Descripción:

Cancela una comisión, verificando que el estado lo permita.

Tipo: PUT

Ruta: /api/v1/commisions/{commisionId}/cancel

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • Path Variable:
    • commisionId (Long): Identificador de la comisión a cancelar.

Datos que devuelven:

  • Respuesta JSON: Mensaje indicando que la comisión fue cancelada correctamente. Ejemplo:
    "Commission canceled successfully."

Resumen de uso de métodos del CommisionService en CommisionController

Método del ServicioEndpoint en el ControladorDescripción breve
getAllCommisions()GET /api/v1/commisionsRecupera todas las comisiones.
createCommision(commisionDTO, artistId)POST /api/v1/commisions/{artistId}Crea una nueva comisión para un artista específico.
requestChangesCommision(commisionDTO, commisionId)PUT /api/v1/commisions/{commisionId}/requestChangesSolicita cambios en una comisión existente.
getCommisionById(commisionId)GET /api/v1/commisions/{commisionId}Recupera una comisión específica por su "ID".
updateCommisionStatus(commisionId, accept)PUT /api/v1/commisions/{commisionId}/acceptActualiza el estado de una comisión según aceptación o rechazo.
waitingCommission(priceChanged, commisionId)PUT /api/v1/commisions/{commisionId}/waitingPone una comisión en espera para confirmación del precio.
toPayCommission(commisionId)PUT /api/v1/commisions/{commisionId}/toPayCambia el estado de la comisión a "para pagar".
rejectCommission(commisionId)PUT /api/v1/commisions/{commisionId}/rejectRechaza una comisión.
acceptCommission(commisionId)PUT /api/v1/commisions/{commisionId}/acceptAcepta una comisión.
cancelCommission(commisionId)PUT /api/v1/commisions/{commisionId}/cancelCancela una comisión.

Esta es la documentación para el servicio CommisionService.


SearchService

Descripción General del Servicio:

El SearchService proporciona funcionalidades de búsqueda para obras de arte y artistas dentro de la aplicación. Permite realizar búsquedas específicas basadas en texto, precio, y otros filtros, como el número mínimo de obras realizadas por los artistas. Además, ofrece la capacidad de realizar búsquedas combinadas de obras y artistas en un único resultado paginado.

Métodos Implementados:

Método 1: searchWorks

Descripción:

Este método se encarga de buscar obras de arte utilizando parámetros de texto (query), rango de precios (minPrice, maxPrice), y paginación (page, size).

Tipo: GET

Ruta: /api/v1/search/works

Categoría de la llamada:

  • Bien hecha: Este servicio está completamente implementado y funcionando como se esperaba.

Datos que reciben:

  • query (String, opcional): Texto para buscar en los títulos y descripciones de las obras.
  • minPrice (Double, opcional): Precio mínimo para filtrar las obras.
  • maxPrice (Double, opcional): Precio máximo para filtrar las obras.
  • page (Integer, opcional, default: 0): Número de página.
  • size (Integer, opcional, default: 10): Tamaño de la página.

Datos que devuelven:

Devuelve una página de objetos SearchWorkDTO. Cada obra contiene detalles como el "id", name, description, image, y artistUsername.

Ejemplo de respuesta para searchWorks:

{
"content": [
{
"id": 1,
"name": "Obra Ejemplo",
"description": "Descripción de la obra",
"image": "base64string",
"artistUsername": "yellow"
}
],
"pageable": {
"pageNumber": 0,
"pageSize": 10
},
"totalElements": 50,
"totalPages": 5
}

Método 2: searchArtists

Descripción:
Permite buscar artistas utilizando nombre, username o email, y/o el número mínimo de obras realizadas.

Tipo: GET
Ruta: /api/v1/search/artists

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • query (String, opcional): Texto para buscar en nombre, username o email.
  • minWorksDone (Integer, opcional): Mínimo número de obras realizadas.
  • page (Integer, opcional, default: 0): Número de página.
  • size (Integer, opcional, default: 10): Tamaño de la página.

Datos que devuelven:
Página de objetos Artist.

Errores comunes:

  • minWorksDone < 0: Lanza ResourceNotOwnedException.

Dependencias:

  • ArtistRepository
{
"content": [
{
"id": 12,
"username": "artistaestrella",
"name": "Artista Estrella",
"email": "estrella@arte.com",
"worksDone": 7,
"profileImage": "base64string",
"bio": "Pintora especializada en retratos digitales.",
"location": "Madrid, España"
},
{
"id": 17,
"username": "coloresvivos",
"name": "Colores Vivos",
"email": "colores@vivos.com",
"worksDone": 10,
"profileImage": "base64string",
"bio": "Ilustrador y diseñador gráfico.",
"location": "Sevilla, España"
}
],
"pageable": {
"pageNumber": 0,
"pageSize": 10
},
"totalElements": 2,
"totalPages": 1,
"last": true,
"first": true,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"numberOfElements": 2,
"size": 10,
"number": 0,
"empty": false
}

Método 3: searchWorksByArtist

Descripción:
Devuelve las obras asociadas a un artista específico a partir de su artistId.

Tipo: GET
Ruta: /api/v1/search/works/artist/{artistId}

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • artistId (Integer): "ID" del artista.
  • page (Integer, opcional, default: 0): Número de página.
  • size (Integer, opcional, default: 10): Tamaño de la página.

Datos que devuelven:
Una página de objetos SearchWorkDTO con información básica de cada obra: "id", nombre, descripción, imagen y nombre de usuario del artista.

Errores comunes:

  • Si el artistId no existe, se devolverá un error controlado desde el repositorio o se lanzará una excepción relacionada.

Dependencias:

  • WorkRepository

Ejemplo de respuesta:

{
"content": [
{
"id": 5,
"name": "Retrato de Invierno",
"description": "Un retrato digital en tonos fríos.",
"image": "base64string",
"artistUsername": "artistaestrella"
},
{
"id": 8,
"name": "Bosque Encantado",
"description": "Ilustración fantástica de un bosque mágico.",
"image": "base64string",
"artistUsername": "artistaestrella"
}
],
"pageable": {
"pageNumber": 0,
"pageSize": 10
},
"totalElements": 2,
"totalPages": 1,
"last": true,
"first": true,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"numberOfElements": 2,
"size": 10,
"number": 0,
"empty": false
}

Método 4: searchAll

Descripción:
Realiza una búsqueda combinada de artistas y obras en un único resultado paginado. Permite aplicar filtros opcionales como texto (query), número mínimo de obras realizadas (minWorksDone) y rango de precios (minPrice, maxPrice).

Tipo: GET
Ruta: /api/v1/search/all

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • query (String, opcional): Texto para buscar tanto en obras como artistas.
  • minWorksDone (Integer, opcional): Mínimo número de obras realizadas por los artistas.
  • minPrice (Double, opcional): Precio mínimo de las obras.
  • maxPrice (Double, opcional): Precio máximo de las obras.
  • page (Integer, opcional, default: 0): Número de página.
  • size (Integer, opcional, default: 10): Tamaño de la página.

Datos que devuelven:
Página combinada de resultados, que puede incluir tanto artistas como obras. El tipo exacto de cada elemento puede distinguirse por sus propiedades (por ejemplo, artistUsername indica una obra; email y worksDone indican un artista).

Errores comunes:

  • minPrice > maxPrice: Lanza ResourceNotOwnedException.
  • minWorksDone < 0: Lanza ResourceNotOwnedException.
  • Página negativa: Lanza ResourceNotOwnedException.

Dependencias:

  • ArtistRepository
  • WorkRepository

Ejemplo de respuesta:

{
"content": [
{
"id": 2,
"name": "Aurora Boreal",
"description": "Paisaje digital de auroras",
"image": "base64string",
"artistUsername": "coloresvivos"
},
{
"id": 9,
"username": "coloresvivos",
"name": "Colores Vivos",
"email": "colores@vivos.com",
"worksDone": 10,
"profileImage": "base64string",
"bio": "Ilustrador y diseñador gráfico.",
"location": "Sevilla, España"
}
],
"pageable": {
"pageNumber": 0,
"pageSize": 10
},
"totalElements": 2,
"totalPages": 1,
"last": true,
"first": true,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"numberOfElements": 2,
"size": 10,
"number": 0,
"empty": false
}

Resumen de uso de métodos del SearchService en SearchController

Método del ServicioEndpoint en el ControladorDescripción breve
searchWorks(query, minPrice, maxPrice, page, size)GET /api/v1/search/worksBúsqueda de obras por texto y/o rango de precios.
searchArtists(query, minWorksDone, page, size)GET /api/v1/search/artistsBúsqueda de artistas por texto y/o número de obras.
searchWorksByArtist(artistId, page, size)GET /api/v1/search/artists/{artistId}/worksObtención de obras de un artista específico.
searchAll(query, minWorksDone, minPrice, maxPrice, page, size)GET /api/v1/search/allBúsqueda combinada de artistas y obras con filtros.

StripeConnectService


Intencionadamente en blanco.


WorkService


Intencionadamente en blanco.


AuthoritiesService

Descripción General del Servicio

El AuthoritiesService es responsable de gestionar la creación, actualización y eliminación de usuarios, así como la asignación de roles (ARTIST, CLIENT, etc.). El servicio también maneja la autenticación de roles y la gestión de la información relacionada con los artistas y clientes, incluyendo sus datos personales y perfiles asociados.


Método 1: findByAuthority

Descripción:

Devuelve una autoridad (rol) por su nombre.

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

{
"authority": "ARTIST"
}

Datos que devuelve:

{
"id": 1,
"description": "Nuevo artista",
"baseUser": {
"id": 10,
"username": "nuevoArtista",
"email": "nuevo@correo.com"
}
}

Errores y Excepciones:

  • ResourceNotFoundException si no se encuentra la autoridad con el nombre proporcionado.

Dependencias:

  • AuthoritiesRepository

Método 2: createUser

Descripción:

Crea un nuevo usuario, asignando su rol y guardando su información en la base de datos. Si el rol es ARTIST, también se crea un registro asociado de artista.

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

{
"username": "clientUser",
"password": "password",
"email": "client@example.com",
"authority": "CLIENT",
"firstName": "Client",
"phoneNumber": "987654321"
}

Datos que devuelve:

{
"id": 10,
"username": "clientUser",
"email": "client@example.com"
}

Errores y Excepciones:

  • IllegalArgumentException si el nombre de usuario o el email ya existen en la base de datos..
  • DataAccessException si ocurre un error al guardar los datos.

Dependencias:

  • BaseUserService
  • ArtistService
  • ArtistService
  • AuthoritiesRepository

Método 3: updateUser

Descripción:

Actualiza los datos de un usuario existente, incluyendo su nombre, correo electrónico, número de teléfono y otros detalles. Si el usuario es un ARTIST, también actualiza la información relacionada con el artista.

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

{
"username": "updatedClientUser",
"firstName": "Updated Client",
"email": "updated@example.com",
"phoneNumber": "123456789"
}

Datos que devuelve:

{
"id": 10,
"username": "updatedClientUser",
"email": "updated@example.com"
}

Errores y Excepciones:

  • ResourceNotFoundException si el usuario no se encuentra en la base de datos.
  • DataAccessException si ocurre un error al guardar los datos.

Dependencias:

  • BaseUserService
  • ArtistService

Método 4: deleteUser

Descripción:

Elimina un usuario, verificando que no sea un administrador y que sea el propio usuario quien lo elimine. Si el usuario es un ARTIST, también se elimina su registro asociado.

Tipo: Interno

Categoría: A corregir

Datos que recibe:

{
"id": 10
}

Errores y Excepciones:

  • ResourceNotFoundException si el usuario no se encuentra en la base de datos.
  • AccessDeniedException si el usuario no existe o ocurre cualquier otro error.

Dependencias:

  • BaseUserService
  • ArtistService
  • ClientService

Método 5: findByBaseUserId

Descripción:

Devuelve el artista como Optional a partir del "ID" del BaseUser.

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

{
"baseUserId": 10
}

Datos que devuelve:

{
"present": true,
"value": {
"id": 1,
"description": "Artista opcional",
"baseUser": {
"id": 10,
"username": "opcional",
"email": "opcional@correo.com"
}
}
}

Dependencias:

  • ArtistService

Método 6: deleteArtist

Descripción:

Elimina un artista, siempre que no tenga comisiones en estado ACCEPTED. También borra su usuario base, estados Kanban y categorías asociadas.

Tipo: Interno

Categoría: A corregir

Datos que recibe:

{
"userId": 10
}

Errores y Excepciones:

  • ResourceNotFoundException si el usuario no se encuentra en la base de datos.
  • AccessDeniedException si el usuario no existe o ocurre cualquier otro error.

Dependencias:

  • BaseUserService
  • CommisionRepository
  • StatusKanbanOrderService
  • ArtistCategoryRepository
  • BaseUserRepository

Método 7: findByBaseUserId

Descripción:

Devuelve el artista como Optional a partir del "ID" del BaseUser.

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

{
"baseUserId": 10
}

Datos que devuelve:

{
"present": true,
"value": {
"id": 1,
"description": "Artista opcional",
"baseUser": {
"id": 10,
"username": "opcional",
"email": "opcional@correo.com"
}
}
}

Dependencias:

  • ArtistService

ReportService

Descripción General del Servicio:

El ReportService gestiona las operaciones relacionadas con los reportes, incluyendo la creación, aceptación, rechazo, eliminación y consulta de reportes, así como la gestión de su tipo. También maneja la lógica asociada al proceso de reporte de obras de arte, gestionando las solicitudes y los tipos de reportes.

Métodos Implementados:

Método 1: getReportTypes

Descripción:

Este método recupera todos los tipos de reportes disponibles.

Tipo: GET

Ruta: /api/v1/reports/types

Categoría de la llamada:

  • Bien hecha: El servicio está completamente implementado y funciona como se espera.

Datos que reciben:

  • No requiere parámetros.

Datos que devuelven:

  • Respuesta JSON: Lista de todos los tipos de reportes. Ejemplo:
    [
    {
    "id": 1,
    "type": "Inappropriate Content"
    }
    ]

Método 2: getReports

Descripción:

Este método recupera todos los reportes almacenados en el sistema.

Tipo: GET

Ruta: /api/v1/reports/admin

Categoría de la llamada:

  • Bien hecha: El servicio está completamente implementado y funciona como se espera.

Datos que reciben:

  • No requiere parámetros.

Datos que devuelven:

  • Respuesta JSON: Lista de todos los reportes. Ejemplo:
    [
    {
    "id": 12345,
    "name": "Inappropriate Content",
    "description": "This artwork violates our policy",
    "status": "PENDING"
    }
    ]

Método 3: createReport

Descripción:

Este método crea un nuevo reporte para una obra de arte específica.

Tipo: POST

Ruta: /api/v1/reports

Categoría de la llamada:

  • Bien hecha: El servicio está completamente implementado y funciona como se espera.

Datos que reciben:

  • Request Body:
    • reportDTO (Objeto ReportDTO): Información necesaria para crear el reporte.

Datos que devuelven:

  • Respuesta JSON: Objeto Report con los datos del reporte creado. Ejemplo:
    {
    "id": 12345,
    "name": "Inappropriate Content",
    "description": "This artwork violates our policy",
    "status": "PENDING"
    }

Método 4: acceptReport

Descripción:

Este método acepta un reporte, cambiando su estado a "ACCEPTED".

Tipo: PUT

Ruta: /api/v1/reports/admin/accept/{id}

Categoría de la llamada:

  • Bien hecha: El servicio está completamente implementado y funciona como se espera.

Datos que reciben:

  • Path Variable:
    • "id" (Long): Identificador del reporte a aceptar.

Datos que devuelven:

  • Respuesta JSON: Objeto Report actualizado con el estado "ACCEPTED". Ejemplo:
    {
    "id": 12345,
    "status": "ACCEPTED"
    }

Método 5: rejectReport

Descripción:

Este método rechaza un reporte, cambiando su estado a "REJECTED".

Tipo: PUT

Ruta: /api/v1/reports/admin/reject/{id}

Categoría de la llamada:

  • Bien hecha: El servicio está completamente implementado y funciona como se espera.

Datos que reciben:

  • Path Variable:
    • "id" (Long): Identificador del reporte a rechazar.

Datos que devuelven:

  • Respuesta JSON: Objeto Report actualizado con el estado "REJECTED". Ejemplo:
    {
    "id": 12345,
    "status": "REJECTED"
    }

Método 6: deleteReport

Descripción:

Este método elimina un reporte, pero solo si su estado es "REJECTED".

Tipo: DELETE

Ruta: /api/v1/reports/admin/delete/{id}

Categoría de la llamada:

  • Bien hecha: El servicio está completamente implementado y funciona como se espera.

Datos que reciben:

  • Path Variable:
    • "id" (Long): Identificador del reporte a eliminar.

Datos que devuelven:

  • Respuesta JSON: Mensaje de confirmación de la eliminación. Ejemplo:
    "Reporte eliminado correctamente."

Método 7: addReportType

Descripción:

Este método agrega un nuevo tipo de reporte al sistema.

Tipo: POST

Ruta: /api/v1/reports/admin/types

Categoría de la llamada:

  • Bien hecha: El servicio está completamente implementado y funciona como se espera.

Datos que reciben:

  • Request Body:
    • reportType (Objeto ReportType): Información del nuevo tipo de reporte.

Datos que devuelven:

  • Respuesta JSON: Objeto ReportType con el tipo de reporte creado. Ejemplo:
    {
    "id": 1,
    "type": "Spam Content"
    }

Resumen de uso de métodos del ReportService en ReportController

Método del ServicioEndpoint en el ControladorDescripción breve
getReportTypes()GET /api/v1/reports/typesRecupera todos los tipos de reportes disponibles.
getReports()GET /api/v1/reports/adminRecupera todos los reportes del sistema.
createReport(reportDTO)POST /api/v1/reportsCrea un nuevo reporte.
acceptReport("id")PUT /api/v1/reports/admin/accept/{"id"}Acepta un reporte, actualizando su estado a "ACCEPTED".
rejectReport("id")PUT /api/v1/reports/admin/reject/{"id"}Rechaza un reporte, actualizando su estado a "REJECTED".
deleteReport("id")DELETE /api/v1/reports/admin/delete/{"id"}Elimina un reporte rechazado.
addReportType(reportType)POST /api/v1/reports/admin/typesAgrega un nuevo tipo de reporte al sistema.

Esta es la documentación para el servicio ReportService.



ArtistService

Descripción General del Servicio:

El ArtistService es el componente encargado de gestionar la lógica de negocio asociada a los artistas en la plataforma Holos. Incluye operaciones de persistencia, búsquedas personalizadas y eliminación controlada de artistas, asegurando que no existan conflictos con comisiones activas o elementos relacionados.

En este documento encuentro metodos que son ciertamente redundates los cuales habria que revisar , son funcionales pero no hay necesidad de hacerlos , por ejemplo saveArtist.

Tambien deberiamos revisar el repositorio , si extiende JPA , habria utilizarlo , sino no extenderlo

Métodos Implementados:


Método 1: saveArtist

Descripción:

Guarda un nuevo artista en la base de datos.

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

{
"id": 1,
"description": "Nuevo artista",
"baseUser": {
"id": 10,
"username": "nuevoArtista",
"email": "nuevo@correo.com"
}
}

Datos que devuelve:

{
"id": 1,
"description": "Nuevo artista",
"baseUser": {
"id": 10,
"username": "nuevoArtista",
"email": "nuevo@correo.com"
}
}

Errores y Excepciones:

  • DataAccessException si ocurre un fallo al persistir.

Dependencias:

  • ArtistRepository

Método 2: findArtist

Descripción:

Devuelve un artista por su "ID".

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

{
"artistId": 1
}

Datos que devuelve:

{
"id": 1,
"description": "Artista existente",
"baseUser": {
"id": 10,
"username": "existente",
"email": "existente@correo.com"
}
}

Errores y Excepciones:

  • ResourceNotFoundException si no existe el artista.

Dependencias:

  • ArtistRepository

Método 3: findArtistByUserId

Descripción:

Busca un artista mediante el "ID" del usuario base asociado.

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

{
"userId": 10
}

Datos que devuelve:

Igual al de findArtist

Errores y Excepciones:

  • ResourceNotFoundException si no se encuentra el artista.

Dependencias:

  • ArtistRepository

Método 4: findArtistByUsername

Descripción:

Devuelve un artista usando su nombre de usuario.

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

{
"username": "existente"
}

Datos que devuelve:

Igual al de findArtist

Errores y Excepciones:

  • ResourceNotFoundException si no se encuentra el artista.

Dependencias:

  • ArtistRepository

Método 5: isArtist

Descripción:

Comprueba si el usuario dado está registrado como artista.

Tipo: Interno

Categoría: A corregir

Datos que recibe:

{
"userId": 10
}

Datos que devuelve:

true

Errores y Excepciones:

  • Declara throws Exception innecesariamente.

Dependencias:

  • ArtistRepository

Método 6: deleteArtist

Descripción:

Elimina un artista, siempre que no tenga comisiones en estado ACCEPTED. También borra su usuario base, estados Kanban y categorías asociadas.

Tipo: Interno

Categoría: A corregir

Datos que recibe:

{
"userId": 10
}

Datos que devuelve:

(Sin contenido)

Errores y Excepciones:

  • AccessDeniedException si tiene comisiones aceptadas.
  • ResourceNotFoundException si no existe o si ocurre cualquier error.

Dependencias:

  • ArtistRepository
  • CommisionRepository
  • StatusKanbanOrderService
  • ArtistCategoryRepository
  • BaseUserRepository

Método 7: findByBaseUserId

Descripción:

Devuelve el artista como Optional a partir del "ID" del BaseUser.

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

{
"baseUserId": 10
}

Datos que devuelve:

{
"present": true,
"value": {
"id": 1,
"description": "Artista opcional",
"baseUser": {
"id": 10,
"username": "opcional",
"email": "opcional@correo.com"
}
}
}

Errores y Excepciones:

  • Declara throws Exception innecesariamente.

Dependencias:

  • ArtistRepository

Método 6: deleteArtist

Descripción:

Elimina un artista, siempre que no tenga comisiones en estado ACCEPTED. También borra su usuario base, estados Kanban y categorías asociadas.

Tipo: Interno

Categoría: A corregir (el bloque try/catch captura cualquier excepción y siempre lanza ResourceNotFoundException aunque sea un error lógico)

Datos que recibe:

  • userId (Long)

Datos que devuelve:

  • Ninguno (void)

Errores y Excepciones:

  • AccessDeniedException si tiene comisiones en estado ACCEPTED
  • ResourceNotFoundException si no existe o si ocurre cualquier error

Dependencias:

  • ArtistRepository
  • CommisionRepository
  • StatusKanbanOrderService
  • ArtistCategoryRepository
  • BaseUserRepository

Método 7: findByBaseUserId

Descripción:

Devuelve el artista como Optional a partir del "ID" del BaseUser.

Tipo: Interno

Categoría: Bien hecha

Datos que recibe:

  • baseUserId (Long)

Datos que devuelve:

  • Optional<Artist>

Errores y Excepciones:

  • Declara throws Exception innecesariamente.

Dependencias:

  • ArtistRepository

PaymentService


Intencionadamente en blanco.


CategoryRestService


Intencionadamente en blanco.


ClientRestService


Un apunte es que es el controlador de Client pero las urls empiezan con users.


ClientService

Descripción General del Servicio:

El ClientService gestiona las operaciones relacionadas con los clientes, incluyendo la creación, búsqueda, actualización y eliminación de clientes en el sistema. Además, maneja validaciones relacionadas con las comisiones activas y los informes relacionados con los clientes.

Métodos Implementados:

Método 1: saveClient

Descripción:

Este método se encarga de guardar un cliente en la base de datos.

Tipo: POST

Ruta: /api/v1/clients

Categoría de la llamada:

  • Bien hecha: El servicio está completamente implementado y funciona como se espera.

Datos que reciben:

  • Request Body:
    • client (Objeto Client): Información del cliente a guardar.

Datos que devuelven:

  • Respuesta JSON: Objeto Client con la información del cliente guardado. Ejemplo:
    {
    "id": 1,
    "name": "Juan Pérez",
    "email": "juan@example.com"
    }

Método 2: findClient

Descripción:

Recupera un cliente específico identificado por su "ID".

Tipo: GET

Ruta: /api/v1/clients/{"id"}

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • "id" (Long): Identificador del cliente a recuperar.

Datos que devuelven:

  • Respuesta JSON: Objeto Client con la información del cliente. Ejemplo:
    {
    "id": 1,
    "name": "Juan Pérez",
    "email": "juan@example.com"
    }

Método 3: findClientByUserId

Descripción:

Recupera un cliente basado en el "ID" de usuario.

Tipo: GET

Ruta: /api/v1/clients/byUser/{userId}

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • userId (Long): "ID" del usuario asociado al cliente.

Datos que devuelven:

  • Respuesta JSON: Objeto Client con la información del cliente. Ejemplo:
    {
    "id": 1,
    "name": "Juan Pérez",
    "email": "juan@example.com"
    }

Método 4: isClient

Descripción:

Verifica si un usuario es un cliente en el sistema.

Tipo: GET

Ruta: /api/v1/clients/isClient/{userId}

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • userId (Long): "ID" del usuario a verificar.

Datos que devuelven:

  • Respuesta JSON: Booleano indicando si el usuario es un cliente. Ejemplo:
    {
    "isClient": true
    }

Método 5: findAll

Descripción:

Recupera todos los clientes del sistema.

Tipo: GET

Ruta: /api/v1/clients

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • No se requieren parámetros.

Datos que devuelven:

  • Respuesta JSON: Lista de objetos Client con la información de todos los clientes. Ejemplo:
    [
    {
    "id": 1,
    "name": "Juan Pérez",
    "email": "juan@example.com"
    },
    {
    "id": 2,
    "name": "Ana García",
    "email": "ana@example.com"
    }
    ]

Método 6: deleteClient

Descripción:

Elimina un cliente del sistema, verificando que no tenga comisiones activas y que no tenga registros relacionados.

Tipo: DELETE

Ruta: /api/v1/clients/administrator/clients/{userId}

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • userId (Long): "ID" del cliente a eliminar.

Datos que devuelven:

  • Respuesta JSON: Mensaje de confirmación si la eliminación es exitosa. Ejemplo:
    "Cliente eliminado exitosamente"
    • En caso de error, se devuelve un mensaje de error descriptivo. Ejemplo:
      "No se puede eliminar el cliente porque tiene registros relacionados en otras partes del sistema."

Resumen de uso de métodos del ClientService en ClientRestController

Método del ServicioEndpoint en el ControladorDescripción breve
saveClient(client)POST /api/v1/clientsGuarda un cliente en la base de datos.
findClient("id")GET /api/v1/clients/{"id"}Recupera un cliente por su "ID".
findClientByUserId(userId)GET /api/v1/clients/byUser/{userId}Recupera un cliente por el "ID" del usuario.
isClient(userId)GET /api/v1/clients/isClient/{userId}Verifica si un usuario es un cliente.
findAll()GET /api/v1/clientsRecupera todos los clientes del sistema.
deleteClient(userId)DELETE /api/v1/clients/administrator/clients/{userId}Elimina un cliente del sistema.

ChatMessageService

Descripción General del Servicio:

El ChatMessageService gestiona la lógica de negocio para la creación, eliminación y recuperación de mensajes de chat dentro de la plataforma. Asegura que los mensajes se asocien a las comisiones correspondientes y que se validen las condiciones de acceso antes de permitir la creación o eliminación de los mensajes.

Métodos Implementados:

Método 1: createChatMessage

Descripción:

Este método se encarga de crear un nuevo mensaje de chat asociado a una comisión. Permite añadir texto y, opcionalmente, una imagen (con un límite de tamaño de 5MB).

Tipo: POST

Ruta: /api/v1/messages

Categoría de la llamada:

  • Bien hecha: Este servicio está completamente implementado y funcionando como se esperaba.

Datos que reciben:

  • Request Parts:
    • chatMessage (String): Cadena JSON que representa el objeto ChatMessage con los siguientes campos:
      {
      "text": "Hello, how are you?"
      }
    • image (MultipartFile, opcional): Archivo que contiene la imagen asociada al mensaje.

Datos que devuelven:

  • Respuesta JSON: Objeto ChatMessage representando el mensaje creado. Ejemplo:
    {
    "id": 1,
    "text": "Hello, how are you?",
    "creationDate": "2023-04-20T12:34:56",
    "image": null
    }

Método 2: findConversationByCommisionId

Descripción:

Recupera todos los mensajes de chat asociados a una comisión específica identificada por su "ID".

Tipo: GET

Ruta: /api/v1/messages/chat/{commisionId}

Categoría de la llamada:

  • Bien hecha

Datos que reciben:

  • commisionId (Long): Identificador de la comisión a la que pertenecen los mensajes.

Datos que devuelven:

  • Respuesta JSON: Lista de objetos ChatMessage asociados a la comisión. Ejemplo:
    [
    {
    "id": 1,
    "text": "Hello, how are you?",
    "creationDate": "2023-04-20T12:34:56",
    "image": null
    },
    {
    "id": 2,
    "text": "I'm good, thanks!",
    "creationDate": "2023-04-20T12:35:00",
    "image": null
    }
    ]

Método 3: deleteMessage

Descripción:

Elimina un mensaje de chat identificando por su "ID".

Tipo: DELETE

Ruta: /api/v1/messages/{"id"}

Categoría de la llamada:

  • No se usa

Datos que reciben:

  • Path Variable:
    • "id" (Long): Identificador del mensaje a eliminar.

Datos que devuelven:

  • Respuesta JSON: Objeto MessageResponse confirmando la eliminación del mensaje. Ejemplo:
    {
    "message": "Message deleted successfully!"
    }

Método 4: findAllConversations

Descripción:

Recupera todas las conversaciones de chat en el sistema.

Tipo: GET

Ruta: /api/v1/messages/admin/chats

Categoría de la llamada:

  • No se usa

Datos que reciben:

  • No se requieren parámetros.

Datos que devuelven:

  • Respuesta JSON: Objeto que representa todas las conversaciones de chat. Ejemplo:
    {
    "1": [
    {
    "id": 1,
    "text": "Hello, how are you?",
    "creationDate": "2023-04-20T12:34:56",
    "image": null
    }
    ],
    "2": [
    {
    "id": 2,
    "text": "I'm good, thanks!",
    "creationDate": "2023-04-20T12:35:00",
    "image": null
    }
    ]
    }

Resumen de uso de métodos del ChatMessageService en ChatMessageController

Método del ServicioEndpoint en el ControladorDescripción breve
createChatMessage(chatMessage)POST /api/v1/messagesCrea un nuevo mensaje de chat con opción de incluir imagen.
findConversationByCommisionId(commisionId)GET /api/v1/messages/chat/{commisionId}Recupera todos los mensajes de chat asociados a una comisión.
deleteMessage("id")DELETE /api/v1/messages/{"id"}Elimina un mensaje de chat por su "ID".
findAllConversations()GET /api/v1/messages/admin/chatsRecupera todas las conversaciones de chat.

Metodología de Trabajo para los Servicios:

1. Identificación de Requerimientos de Negocio:

El Frontend o los Stakeholders proporcionan las funcionalidades necesarias, incluyendo las operaciones que el servicio debe manejar, tales como búsquedas de datos, operaciones CRUD (Crear, Leer, Actualizar, Eliminar) y otros requerimientos de la API.

2. Diseño de la Lógica del Servicio:

El Backend define los métodos que implementarán la lógica necesaria para las operaciones solicitadas. Esto incluye la consulta de bases de datos, manipulación de datos, validaciones de negocio, y el tratamiento de errores. Este diseño también se debe alinear con los principios de diseño de servicios RESTful (si corresponde).

3. Definición de los Métodos del Servicio:

El Backend estructura los métodos del servicio de acuerdo con la lógica previamente diseñada. Los métodos se documentan, y se definen los parámetros de entrada (como los DTOs) y la salida (como las respuestas JSON). Los servicios pueden ser modificados según los cambios en los requerimientos o en la base de datos.

4. Desarrollo e Implementación del Servicio:

El Backend implementa el servicio según lo definido en la fase anterior, asegurándose de que cada método esté alineado con los requerimientos. Durante esta etapa, el servicio es probado de manera local por el Backend para verificar que las funcionalidades de cada método estén completas y funcionen correctamente.

5. Revisión de Datos y Seguridad:

El Backend revisa que no se envíen datos innecesarios o sensibles en las respuestas del servicio. También se realiza una validación rigurosa para asegurarse de que no se expongan datos privados. Si es necesario, se realizan ajustes en la configuración de seguridad, como el uso de tokens de autenticación o la validación de permisos.

6. Pruebas Unitarias:

El Backend desarrolla pruebas unitarias para cada método del servicio, verificando que la lógica implementada esté funcionando correctamente. Se debe comprobar que las respuestas sean las esperadas, y se manejan correctamente los errores y excepciones.

7. Pruebas de Integración:

El servicio se integra con otros servicios o con la base de datos, y se realizan pruebas de integración para asegurarse de que el servicio interactúe correctamente con otros sistemas. Esto incluye verificar que las consultas a la base de datos devuelvan los resultados correctos.

8. Entrega al Frontend y Ajustes:

Una vez que el servicio ha sido implementado y probado, el Frontend recibe el servicio para su integración en la interfaz de usuario. Durante esta fase, el Frontend realiza pruebas de integración y proporciona retroalimentación al Backend para realizar ajustes en caso de que la implementación no se alinee perfectamente con sus necesidades.

9. Documentación y Mantenimiento:

Se genera la documentación final del servicio, describiendo cómo se utiliza cada endpoint, los parámetros que recibe, las respuestas que devuelve y cualquier consideración especial (errores comunes, validaciones, etc.). Además, se establece un proceso de mantenimiento para asegurar que el servicio continúe funcionando correctamente a medida que evolucionen los requerimientos y el sistema.